package com.hk.commons;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class ZipUtil {   
	  
	/**  
     * 字符串的压缩  
     *   
     * @param str  
     *            待压缩的字符串  
     * @return    返回压缩后的字符串  
     * @throws IOException  
     */  
    public static String compress(String str) throws IOException {  
        if (null == str || str.length() <= 0) {  
            return str;  
        }  
        // 创建一个新的 byte 数组输出流  
        ByteArrayOutputStream out = new ByteArrayOutputStream();  
        // 使用默认缓冲区大小创建新的输出流  
        GZIPOutputStream gzip = new GZIPOutputStream(out);  
        // 将 b.length 个字节写入此输出流  
        gzip.write(str.getBytes());  
        gzip.close();  
        // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串  
        return out.toString("ISO-8859-1");  
    }  
      
    /**  
     * 字符串的解压  
     *   
     * @param str  
     *            对字符串解压  
     * @return    返回解压缩后的字符串  
     * @throws IOException  
     */  
    public static String unCompress(String str) throws IOException {  
        if (null == str || str.length() <= 0) {  
            return str;  
        }  
        // 创建一个新的 byte 数组输出流  
        ByteArrayOutputStream out = new ByteArrayOutputStream();  
        // 创建一个 ByteArrayInputStream，使用 buf 作为其缓冲区数组  
        ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes("ISO-8859-1"));  
        // 使用默认缓冲区大小创建新的输入流  
        GZIPInputStream gzip = new GZIPInputStream(in);  
        byte[] buffer = new byte[256];  
        int n = 0;  
        while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组  
            // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流  
            out.write(buffer, 0, n);  
        }  
        // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串  
        return out.toString("GBK");  
    }  
  
	  // 测试方法   
	  public static void main(String[] args) throws IOException {   
		  // 字符串超过一定的长度  
	         String str = "Fb7gCTOporObld0d/s/1AdaVymf4tSRPA9jLQR1eLJytjW+4qtWu0ygaIMRjDSYT9uqlaQUUa3I5YUSTbikh4lUvv+P+mpVXLz+p6Cn89J72Zvz0zL5VB4E5k7AoHJErU7R5YlblTL1mvE+xI+7x78VdEWOG47KRSbJB8Mrg7HDpe5YrhejrhzLogCtBedvMiTkGrKwC6emzveU0EklMtRju+ipTr92a4ch7QX2W5lTN1WWtQo8Mb7BqwWhsTA6tY+vog8tecf7/otgnf0aL6JbPzcFRFhQgWZliHT3Yy8GvEYEH8IirsJGU4QKasDr2c+1SwUnNZ3usA6+bf9/Xow==";  
	         System.out.println("\n原始的字符串为------->" + str);  
	         float len0=str.length();  
	         System.out.println("原始的字符串长度为------->"+len0);  
	   
	         String ys = compress(str);  
	         System.out.println("\n压缩后的字符串为----->" + ys);  
	         float len1=ys.length();  
	         System.out.println("压缩后的字符串长度为----->" + len1);  
	   
	         String jy = unCompress(ys);  
	         System.out.println("\n解压缩后的字符串为--->" + jy);  
	         System.out.println("解压缩后的字符串长度为--->"+jy.length());  
	           
	         System.out.println("\n压缩比例为"+len1/len0);  
	           
	         //判断  
	         if(str.equals(jy)){  
	             System.out.println("先压缩再解压以后字符串和原来的是一模一样的");  
	         }  
	  }public ZipUtil() {
		// TODO Auto-generated constructor stub
	}@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
}
